package com.hugang.designmode.singleton;

/**
 * 单例模式：懒汉式，存在线程安全问题，可使用线程同步的方式解决线程安全问题
 *
 * @author hg
 * @date 2020/6/12 10:51
 */
public class SingletonLazyTypeTest {

    public static void main(String[] args) {
        Order order1 = Order.getInstance();
        Order order2 = Order.getInstance();
        System.out.println(order1.equals(order2));

    }
}

class Order {

    /**
     * 1、私有化构造器
     */
    private Order() {

    }

    /**
     * 2、声明静态实例变量，赋值null
     */
    private static Order instance;

    /**
     * 3、提供公共的获取实例的方法，当静态实例为空时，则赋值
     */
    public static Order getInstance() {
//        //方式1，效率稍差，因为所有的线程都会等待锁的释放
//        synchronized (Order.class) {
//            if (instance == null ){
//                instance = new Order();
//            }
//        }
//        return instance;

        //方式二：效率稍高，因为当instance实例化之后，线程就不用再等待锁的释放了，只有前几个同时进入的线程才需要等待锁的释放
        if (instance == null) {
            synchronized (Order.class){
                if (instance == null) {
                    instance = new Order();
                }
            }
        }
        return instance;
    }
}